﻿using Teigha.Core;
using Teigha.TD;

namespace OdaOperation.Utils
{
    public class Common
    {
        // 裁剪直线方法
        public static OdDbLine Spilt(OdGeExtents3d extents3D, OdDbLine line)
        {
            // 获取直线的起点
            OdGePoint3d odGePoint3d = new OdGePoint3d();
            line.getStartPoint(odGePoint3d);
            // 获取直线的终点
            OdGePoint3d odGePoint3d2 = new OdGePoint3d();
            line.getEndPoint(odGePoint3d2);

            // 根据直线起点和终点的 x 坐标判断裁剪
            if (odGePoint3d.x > odGePoint3d2.x)
            {
                // 如果起点的 x 坐标大于终点的 x 坐标，则进行判断
                if (odGePoint3d.x > extents3D.maxPoint().x)
                {
                    // 如果起点的 x 坐标大于范围的最大 x 坐标，则将起点 x 坐标设置为范围的最大 x 坐标
                    odGePoint3d.x = extents3D.maxPoint().x;
                }

                // 如果终点的 x 坐标小于范围的最小 x 坐标，则将终点 x 坐标设置为范围的最小 x 坐标
                if (odGePoint3d2.x < extents3D.minPoint().x)
                {
                    odGePoint3d2.x = extents3D.minPoint().x;
                }
            }
            else
            {
                // 如果终点的 x 坐标大于范围的最大 x 坐标，则将终点 x 坐标设置为范围的最大 x 坐标
                if (odGePoint3d2.x > extents3D.maxPoint().x)
                {
                    odGePoint3d2.x = extents3D.maxPoint().x;
                }

                // 如果起点的 x 坐标小于范围的最小 x 坐标，则将起点 x 坐标设置为范围的最小 x 坐标
                if (odGePoint3d.x < extents3D.minPoint().x)
                {
                    odGePoint3d.x = extents3D.minPoint().x;
                }
            }

            // 根据直线起点和终点的 y 坐标判断裁剪（逻辑与上述 x 坐标判断相同）
            if (odGePoint3d.y > odGePoint3d2.y)
            {
                if (odGePoint3d.y > extents3D.maxPoint().y)
                {
                    odGePoint3d.y = extents3D.maxPoint().y;
                }

                if (odGePoint3d2.y < extents3D.minPoint().y)
                {
                    odGePoint3d2.y = extents3D.minPoint().y;
                }
            }
            else
            {
                if (odGePoint3d2.y > extents3D.maxPoint().y)
                {
                    odGePoint3d2.y = extents3D.maxPoint().y;
                }

                if (odGePoint3d.y < extents3D.minPoint().y)
                {
                    odGePoint3d.y = extents3D.minPoint().y;
                }
            }

            // 设置直线的新起点和终点
            line.setStartPoint(odGePoint3d);
            line.setEndPoint(odGePoint3d2);
            return line; // 返回裁剪后的直线对象
        }

        // 将 RGB 颜色字符串转换为 CAD 的颜色对象
        public static OdCmColor RgbToOdCmColor(string rgbStr)
        {
            OdCmColor odCmColor = new OdCmColor(); // 创建 CAD 颜色对象
            if (string.IsNullOrEmpty(rgbStr))
            {
                odCmColor.isByLayer(); // 如果颜色字符串为空，则使用图层颜色
            }
            else
            {
                // 如果颜色字符串为 "ByBlock"，则使用块颜色
                if (rgbStr.Equals("ByBlock"))
                {
                    odCmColor.isByBlock();
                }
                // 如果颜色字符串为 "ByLayer"，则使用图层颜色
                if (rgbStr.Equals("ByLayer"))
                {
                    odCmColor.isByLayer();
                }
                // 如果颜色字符串中包含 RGB 值
                else if (rgbStr.Split(',').Length == 3)
                {
                    string[] array = rgbStr.Split(','); // 分割 RGB 值
                                                        // 设置颜色对象的 RGB 值
                    odCmColor.setRGB(byte.Parse(array[0]), byte.Parse(array[1]), byte.Parse(array[2]));
                    // 如果颜色索引不为 7，或者颜色为白色，则设置颜色索引
                    if (odCmColor.colorIndex() != 7 || rgbStr == "255,255,255")
                    {
                        odCmColor.setColorIndex(odCmColor.colorIndex());
                    }
                    // 如果颜色为 DGN 索引，则设置颜色索引
                    if (odCmColor.isByDgnIndex())
                    {
                        odCmColor.setColorIndex(odCmColor.colorIndex());
                    }
                }
            }

            return odCmColor; // 返回 CAD 颜色对象
        }
    }

}